package com.kexin.coupon.service;

import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kexin.coupon.entity.CouponOrder;
import com.kexin.coupon.vo.OrderDetail;
import com.kexin.coupon.vo.PlaceOrder;

/**
 * 卡券订单表 服务层
 * @author ao
 */
public interface ICouponOrderService {

	/**
	 * 卡券下单
	 * @param userId 用户id
	 * @param couponId 卡券id 
	 * @param num 购买数量
	 * @return
	 */
	OrderDetail submitOrder(Integer userId, Integer couponId, Integer num);

	/**
	 * 取消订单
	 * @param orderNo 订单号
	 */
	void cancelOrder(String orderNo);

	/**
	 * 获取用户已经购买的卡券数量
	 * @param userId 用户id
	 * @param couponCode 卡券编号
	 * @param payState 支付状态数组（0未支付，1已支付，2已过期）
	 * @return
	 */
	int getUserBuyedCount(Integer userId, String couponCode, Object ... payState);

	/**
	 * 卡券订单支付
	 * @param orderNo 订单号
	 * @return
	 */
	PlaceOrder placeAnOrder(String orderNo);

	/**
	 * 卡券订单申请退款
	 * @param orderNo 订单号
	 */
	void submitRefund(String orderNo);

	/**
	 * 卡券订单退款
	 * @param orderNo 订单号
	 */
	void refund(String orderNo);

	/**
	 * 退款审核
	 * @param orderNo 订单号
	 * @param state 审核状态（1同意退款，2拒绝退款）
	 */
	void verifyRefund(String orderNo, String state);

	/**
	 * 获取卡券订单列表数据
	 * @param userId 用户id
	 * @param couponName 卡券名称
	 * @param payState 支付状态，0未支付，1已支付，2已过期，3已核销（多个状态以“,”分割）
	 * @param useState 使用状态，0未使用，1已使用（多个状态以“,”分割）
	 * @param refundState 退款状态，0未退款，1已退款，2退款失败（多个状态以“,”分割）
	 * @param current 页码
	 * @param size 单页显示条数
	 * @return
	 */
	Page<CouponOrder> queryList(Integer userId, String couponName, 
			String payState, String useState, String refundState, 
			Integer current, Integer size);

	/**
	 * 支付回调
	 * @param param 参数
	 */
	void result(Map<String, Object> param);

	/**
	 * 卡券核销
	 * @param param 参数
	 */
	void used(JSONObject param);

	/**
	 * 取消未支付的订单
	 */
	void cancelNotPayOrders();

	/**
	 * 自动退款过期的卡券
	 */
	void refundOutOfDateOrders();

	/**
	 * 自动处理之前退款失败的订单
	 */
	void refundFailOrders();

	/**
	 * 自动处理正在退款的订单
	 */
	void updateRefundingOrders();
}
